/*
* FileSystemUtils.java
*
* Created on October 4, 2006, 8:08 AM
*
* Description: Spring Framework file system utilities.
*
* Copyright (C) 2009 Stephen L. Reed.
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.texai.util;
import java.io.File;
import java.io.IOException;
import java.security.InvalidParameterException;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
/**
* Utility methods for working with the file system.
*
* @author Rob Harrop
* @author Juergen Hoeller
* @since 2.5.3
*/
public final class FileSystemUtils {
/** the logger */
public static final Logger LOGGER = Logger.getLogger(FileSystemUtils.class);
/** This class is never instantiated. */
private FileSystemUtils() {
}
/** Deletes the supplied {@link File} - for directories,
* recursively delete any nested directories or files as well.
*
* @param root the root <code>File</code> to delete
* @return <code>true</code> if the <code>File</code> was deleted,
* otherwise <code>false</code>
*/
public static boolean deleteRecursively(final File root) {
//Preconditions
if (root == null) {
throw new InvalidParameterException("root must not be null");
}
if (root.exists()) {
if (root.isDirectory()) {
final File[] children = root.listFiles();
if (children != null) {
for (final File child : children) {
deleteRecursively(child);
}
}
}
return root.delete();
}
return false;
}
/** Archives the given source directory to the given destination directory, without overwriting unchanged files.
*
* @param sourceDirectory the source directory
* @param destinationDirectory the destination directory
*/
public static void archiveDirectory(
final File sourceDirectory,
final File destinationDirectory) {
//Preconditions
assert sourceDirectory != null : "sourceDirectory must not be null";
assert sourceDirectory.exists() : "sourceDirectory must exist";
assert destinationDirectory != null : "destinationDirectory must not be null";
if (destinationDirectory.exists()) {
if (destinationDirectory.isDirectory() == false) {
throw new TexaiException("Destination '" + destinationDirectory + "' exists but is not a directory");
}
} else if (destinationDirectory.mkdirs() == false) {
throw new TexaiException("Destination '" + destinationDirectory + "' directory cannot be created");
}
if (destinationDirectory.canWrite() == false) {
throw new TexaiException("Destination '" + destinationDirectory + "' cannot be written to");
}
final File[] files = sourceDirectory.listFiles();
if (files == null) { // null if security restricted
throw new TexaiException("Failed to list contents of " + sourceDirectory);
}
for (final File sourceFile : files) {
final File destinationFile = new File(destinationDirectory, sourceFile.getName());
if (sourceFile.isDirectory()) {
// recurse
archiveDirectory(sourceFile, destinationFile);
} else {
if (!destinationFile.exists() || destinationFile.lastModified() < sourceFile.lastModified()) {
try {
LOGGER.info("copy " + sourceFile + " to " + destinationFile);
FileUtils.copyFile(sourceFile, destinationFile);
} catch (IOException ex) {
throw new TexaiException(ex);
}
}
}
}
//Postconditions
assert destinationDirectory.exists() : "destinationDirectory must exist";
}
}